#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//qsort(要排序的数组，要排序的元素个数，每个元素的大小，比较方法 -> 函数指针)
//比较方法: int(*compar)(consr void*,const void*) compar是函数指针，指向的函数的返回值为int,参数为const void*

//结论:数组名是首元素地址，假设为A，则在比较函数当中,是 *(A)e1 和 *(A)e2 进行比较,先把e1和e2强转,然后解引用按规则比较

//1.排序整形数组
int cmp_int(const void* e1,const void* e2)
{
  return *(int*)e1 - *(int*)e2;
}
void test1()
{
  int arr[] = {9,8,7,6,5,6,4,7,8,3,2};
  int n = sizeof(arr)/sizeof(arr[0]);
  qsort(arr,n,sizeof(arr[0]),cmp_int);
  for(int i = 0;i<n;i++)
    printf("%d ",arr[i]);
  printf("\n");
}
//2.排序字符数组
int cmp_char(const void* e1,const void* e2)
{
  return *(char*)e1 - *(char*)e2; //本质是比较ascii码
}
void test2()
{
  char arr[] = {'h','d','a','z','w','y','\0'};
  int n = sizeof(arr)/sizeof(arr[0]);
  qsort(arr,n-1,sizeof(arr[0]),cmp_char); //这里要比较的元素个数是n-1个 因为\0不需要比较
  printf("%s\n",arr);
}

//3.排序浮点数数组
#define PRECISION 0.00000000 // 精度
int cmp_double(const void* e1,const void* e2)
{
  //err写法: return *(double*)e1 - *(double*)e2;
  //假设0.2 - 0.1 最后返回的值是0
  if(*(double*)e1 - *(double*)e2 == PRECISION)
    return 0;
  else if(*(double*)e1 - *(double*)e2 > PRECISION)
    return 1;
  else 
    return -1;
}
void test3()
{
  double arr[] = {2.2,3.4,1.2,1.1,1.4};
  int n = sizeof(arr)/sizeof(arr[0]);
  qsort(arr,n,sizeof(arr[0]),cmp_double);
  for(int i = 0;i<n;i++)
    printf("%lf ",arr[i]);
  printf("\n");
}

//4.排序字符指针数组
int cmp_charPoint(const void* e1,const void* e2)
{
  return strcmp(*(char**)e1,*(char**)e2);//本质是字符串比较,注意首元素的地址是:char**
}
void test4()
{
  char* arr[] = { "c","b","a"};
  int n = sizeof(arr)/sizeof(arr[0]);
  qsort(arr,n,sizeof(arr[0]),cmp_charPoint);
  for(int i = 0;i<n;i++)
    printf("%s\n",arr[i]);
}

//5.排序结构体数组
typedef struct Stu
{
    int age;
    char name[20];
}Stu;
int cmp_age(const void* e1,const void* e2)
{
    return ((Stu*)e1)->age  - ((Stu*)e2)->age; //需要注意用括号括起来e1和e2！！
}
int cmp_name(const void* e1,const void* e2)
{
    return strcmp(((Stu*)e1)->name,((Stu*)e2)->name);//本质上字符串比较
}
void test5()
{
    Stu arr[3] = {{19,"Mango"},{18,"Lemon"},{20,"LRF"}};
    int sz = sizeof(arr)/sizeof(arr[0]);
    // qsort(arr,sz,sizeof(arr[0]),cmp_age); //按年龄排序
    // for(int i = 0;i<sz;i++)
    //     printf("age:%d name:%s\n",arr[i].age,arr[i].name);

    qsort(arr,sz,sizeof(arr[0]),cmp_name); //按名字排序
    for(int i = 0;i<sz;i++)
        printf("age:%d name:%s\n",arr[i].age,arr[i].name);
}
int main()
{
  test5();
  return 0;
}

